Lesson 2

Python Basic, Lesson 2,

  • v1.0, 2016
  • v1.1, 2020.2,3,4 edit by David Yi

本章内容要点

  • 学习之前
  • 基本变量概念
  • print() 和 input() 用法

学习之前

从现在开始,我们进入到 Python 正式的学习课程。本课程使用 Jupyter Notebook 格式撰写,推荐你也安装 jupyter notebook 或者通过安装 anaconda 来使用。

我们通过简单的描述和举例来进行 Python 编程开发的讲解,需要你自己运行 notebook 里面的代码,并且最好建议自己输入一遍代码去运行,看看是否得到了预料中的结果,不要怕发生错误,发生错误后,首先检查一下代码输入是否正确,有时候也可以在 jupyter 菜单上找到 Kernel-Restart,重启 jupyter 来解决问题。

我们并不想像标准的编程书籍和教材一样,去系统的讲解很多基本概念,一方面可能有些朋友已经学习过一些电脑编程语言,很多概念都是相通的,另一方面很多基本概念的学习其实是一件比较枯燥的事情,会让我们失去一些学习的兴趣。因此我们尽量用实战来代替,通过例子和自己操作来掌握 Python 的语法,掌握编程的一些理念。或许会碰到搞不懂的一些问题,就先记住怎么操作即可,通过输入代码联系、作业、思考、自己动手编程等方式来学习。

基本变量概念

变量用来在程序中存储内容。变量是编程开发中最基本的概念。

Python 中的变量赋值不需要类型声明。

每个变量在内存中创建,都包括变量的标识,名称和数据这些信息, 每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建, 等号= 用来给变量赋值, 等号= 左边是一个变量名,等号右边是存储在变量中的值。


In [ ]:
counter = 100  # 整型变量
miles = 1000.0 # 浮点型(小数)
name = "John"  # 字符串
name2 = 'Tom'

# 显示指定变量名的内容
print(name2)

In [1]:
flag = False  # 布尔值

#显示变量的类型
print(type(flag))


<class 'bool'>

In [3]:
# 多个变量赋值, Python 的写法比较简洁

a = b = c = 1
b = 2 
print(a,b,c)


1 2 1

In [2]:
# 字符串变量赋值

s = s1 = 'Hello'
print(s,s1)


Hello Hello

In [41]:
# 多个变量赋值

a, b, c = 1, 2, 3
print(a,b,c)


1 2 3

In [42]:
# 交换变量

a, b = 1, 2
a, b = b, a
print(a,b)


2 1

变量是动态的

Python是动态语言,即变量本身的类型不固定。

与之对应的静态语言(如Java),在定义变量时,必须先指定变量类型,赋值时如不匹配会报错。


In [1]:
# 定义一个整数变量
a = 1
print(a)
print(type(a))

# 变成字符串变量
a = 's'
print(a)
print(type(a))


1
<class 'int'>
s
<class 'str'>

理解 Python 变量在内存中的表示

当我们输入 a = 'ABC' 时,Python解释器做了2件事情:

  1. 在内存中创建了一个'ABC'的字符串,

  2. 在内存中创建了一个名为a的变量,并把它指向'ABC'。

也可以把一个变量a赋值给另一个变量b,这个操作实际上是把变量b指向变量a所指向的数据


In [4]:
# 改变变量的内容

a = 'ABC'
b = a
a = 'XYZ'
print(b)


ABC

In [5]:
# 用 id() 可以得到变量的内存地址

print(id(a))
print(id(b))


1484255105584
1484213441648

In [6]:
# 指向同一个变量内容的变量内存地址其实是一样的
# 注意id(100)的地址和a 的地址是一样的

a = 100
b = 101
print(id(a))
print(id(b))
print(id(100))


140707816582640
140707816582672
140707816582640

In [7]:
# 变量内容发生变化后,内存地址会发生变化

b = b + 1
print(id(a))
print(id(b))


140707816582640
140707816582704

In [8]:
# 指向同一个变量内容的变量内存地址这里又不一样了

a = 300
b = 300
print(id(a))
print(id(b))


1484255064464
1484255065072

Python 有一些很优雅的设计,来提升性能,对于0-255这些常用的数字,Python 内部是有缓存的。


print() 和 input() 用法

print() 用来显示内容,input() 用来输入内容,在类似命令行的操作中,这两条语句非常有用。程序要做的事情主要就是三种,输入、计算、输出。所以输入输出命令很重要,让我们迅速的了解电脑程序处理的基本原理,并且了解 Python 语言的基本规则。

在实际应用开发中,在电脑屏幕上输出内容已经比较少了,现在我们看到的大多是网页、移动App和小程序等。在学习过程中,我们主要用 print 来输出内容。

print() 也支持格式化输出,可以将内容按照指定的格式整理输出。


In [9]:
# 输出数字和变量内容

print(100)

a = 100
print(a)


100
100

In [ ]:
# 先通过输入内容到变量,然后再输出

name = input('name:')
print( 'hello', name)

下面的例子引入条件判断语句,if 语句。Python 中 if 语句很容易理解,注意条件后面的冒号不要忘记,还有缩进格式。

Python 官方目前有写得不错的中文文档,可以学习。 https://docs.python.org/zh-cn/3/tutorial/controlflow.html#if-statements


In [ ]:
# 根据变量a 的值来判断

a = 10
if a > 10:
    print('big')
else:
    print('small')

In [ ]:
for i in range(13):
    print(i)

下面的例子引入循环语句 for,后面还会详细解释,这里先有个印象即可。


In [ ]:
for i in 'hello':
    print(i)

In [ ]:
# 支持格式化的 print

s = 'hello'
x = len(s)  
print('The length of %s is %d' % (s,x))

In [ ]:
# 更加好,更加 pythonic 的写法:format函数-增强的格式化字符串函数
# 关于format的更多细节,参见 https://docs.python.org/zh-cn/3/library/string.html#format-string-syntax
# 通过关键字传参
print('{greet} from {language}'.format(greet='hello', language='English'))

# 通过位置传参
print('{0} from {1}'.format('hello', 'English'))

In [ ]:
# 支持格式化的 print 的另外一种写法

s = 'hello'
x = len(s)  
print('The length of {word} is {length}'.format(word=s,length=x))

print() 格式化输出说明

  • %字符:标记转换说明符的开始

  • 转换标志:-表示左对齐;+表示在转换值之前要加上正负号;“”(空白字符)表示正数之前保留空格;0表示转换值若位数不够则用0填充。

  • 最小字段宽度:转换后的字符串至少应该具有该值指定的宽度。如果是*,则宽度会从值元组中读出。

  • 点(.)后跟精度值:如果转换的是实数,精度值就表示出现在小数点后的位数。如果转换的是字符串,那么该数字就表示最大字段宽度。如果是*,那么精度将从元组中读出。

  • 字符串格式化转换类型。

转换类型 含义

  • d,i:带符号的十进制整数
  • o:不带符号的八进制
  • u:不带符号的十进制
  • x:不带符号的十六进制(小写)
  • X:不带符号的十六进制(大写)
  • e:科学计数法表示的浮点数(小写)
  • E:科学计数法表示的浮点数(大写)
  • f,F:十进制浮点数
  • g:如果指数大于-4或者小于精度值则和e相同,其他情况和f相同
  • G:如果指数大于-4或者小于精度值则和E相同,其他情况和F相同
  • C:单字符(接受整数或者单字符字符串)
  • r:字符串(使用repr转换任意python对象)
  • s:字符串(使用str转换任意python对象)

In [ ]:
# 格式化 print 举例

pi = 3.141592653  

print('%10.3f' % pi) #字段宽10,精度3 

print("pi = %.*f" % (3,pi)) #用*从后面的元组中读取字段宽度或精度  
  
print('%010.3f' % pi) #用0填充空白  
  
print('%-10.3f' % pi) #左对齐  
       
print('%+f' % pi) #显示正则表达式

Python 从3.6版本开始引入 f-string,称为格式化字符串常量,主要目的是使格式化字符串的操作更加简便。f-string在形式上是以 f 或 F 修饰符引领的字符串(f'xxx' 或 F'xxx'),以大括号 {} 标明被替换的字段;f-string在本质上并不是字符串常量,而是一个在运行时运算求值的表达式。

f-string 在功能方面不逊于传统的 %-formatting语句和 str.format()函数,同时性能又优于二者,且使用起来也更加简洁明了,因此对于 Python3.6及以后的版本,推荐使用f-string进行字符串格式化。


In [ ]:
a = 3.141592653 
f'a is {a:10.3f}'